home *** CD-ROM | disk | FTP | other *** search
/ Game Cracker (Expanded Edition) / Game Cracker (Expanded Edition).iso / cracks / SV_SHPWK.ZIP / ShipWreckers.txt < prev    next >
Text File  |  1998-02-28  |  13KB  |  247 lines

  1.  
  2. Free Information Xchange '98 presents:
  3.  
  4. Shipwreckers! - CD crack by Static Vengeance
  5.  
  6. Requirements:
  7. hex editor and full install
  8.  
  9.     Time for another tutorial on CD check removal.  This time we will be looking at a game called
  10. Shipwreckers! by Psygnosis.  This game requires a 3D accelerator card and is kind of hard to describe.
  11. It's and action puzzle type game somewhat like a platform jumper but no platforms.  Instead of a guy
  12. to run around you drive a ship and blow things up and solve sequence puzzles and such.  Anywyas, the
  13. graphics rock on a 3Dfx card, and the game is fun to play.  However as you can see by this article,
  14. there is a bug or two in Shipwreckers!  Bugs that need to be FiX'ed.  There's that same old pesky CD
  15. check that must pass before you can play a game.  And as you know the whole point of doing a full
  16. install is so you can run the game off your hard drive.  I just hate digging through a stack of CD's
  17. just so I can put the game CD in for a second for the copy protection to pass.  I can live without
  18. the music tracks that come with the game.  So load up W32Dasm and start disassembling sw.exe.  When
  19. W32Dasm has finished it's work go up to the menu bar and select "Refs" and then select "String data
  20. references" from the drop down menu.  From the refs box, grab the slider bar and scroll down to the
  21. string "SHIPWRECKERS! CD NOT PRESENT" and double click on it.  This puts you in the middle of the
  22. routine that checks for the CD, and that routine goes something like this:
  23.  
  24. * Referenced by a CALL at Address:
  25. |:004405C5                                        <-- Where this routine was called from
  26. |
  27. :00406FCC 53                      push ebx
  28. :00406FCD 51                      push ecx
  29. :00406FCE 52                      push edx
  30. :00406FCF 55                      push ebp
  31. :00406FD0 89E5                    mov ebp, esp
  32. :00406FD2 89C3                    mov ebx, eax
  33.  
  34. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  35. |:0040700C(U)
  36. |
  37. :00406FD4 E86BFDFFFF              call 00406D44                      <-- Check through WINMM.mciSendCommandA
  38. :00406FD9 833DA0644B0001          cmp dword ptr [004B64A0], 00000001
  39. :00406FE0 752C                    jne 0040700E                       <-- Take this jump if CD is there
  40. :00406FE2 85DB                    test ebx, ebx
  41. :00406FE4 7424                    je 0040700A
  42. :00406FE6 6A35                    push 00000035
  43.  
  44. * Possible StringData Ref from Data Obj ->"Shipwreckers! CD Validator"
  45.                                   |
  46. :00406FE8 6834204B00              push 004B2034
  47.  
  48. * Possible StringData Ref from Data Obj ->"SHIPWRECKERS! CD NOT PRESENT"  <-- String that got us here
  49.                                   |
  50. :00406FED 6850204B00              push 004B2050
  51. :00406FF2 53                      push ebx
  52.  
  53. * Reference To: USER32.MessageBoxA, Ord:0010h
  54.                                   |
  55. :00406FF3 2EFF1588134B00          Call dword ptr cs:[004B1388]
  56. :00406FFA 85C0                    test eax, eax
  57. :00406FFC 7405                    je 00407003
  58. :00406FFE 83F802                  cmp eax, 00000002                 <-- You hit Cancel from dialog box
  59. :00407001 7507                    jne 0040700A                      <-- If not Cancel then jump to retry
  60.  
  61. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  62. |:00406FFC(C)
  63. |
  64. :00407003 31C0                    xor eax, eax                      <-- Set for failed CD check
  65. :00407005 5D                      pop ebp
  66. :00407006 5A                      pop edx
  67. :00407007 59                      pop ecx
  68. :00407008 5B                      pop ebx
  69. :00407009 C3                      ret
  70.  
  71. * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
  72. |:00406FE4(C), :00407001(C)
  73. |
  74. :0040700A 89D8                    mov eax, ebx
  75. :0040700C EBC6                    jmp 00406FD4                     <-- Go back and try again
  76.  
  77. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  78. |:00406FE0(C)
  79. |
  80. :0040700E B801000000              mov eax, 00000001                <-- Everything is fine CD is present
  81. :00407013 5D                      pop ebp
  82. :00407014 5A                      pop edx
  83. :00407015 59                      pop ecx
  84. :00407016 5B                      pop ebx
  85. :00407017 C3                      ret
  86.  
  87.     Fairly simple when you look at it.  The CD check is done through WINMM.DLL (WINdows Multi-Media)
  88. calls like WINMM.mciSendCommandA and WINMM.mciGetErrorStringA.  The routine at 406D44 checks for a music
  89. track and compares against known values.  If the routine doesn't find what it's looking for, then it's
  90. assumed you don't have the original CD in your CD-ROM drive.  Okay, now let's take a quick look at the
  91. section of code that calls the CD check routine.  That call and surounding code looks like this:
  92.  
  93. :004405B6 A174274E00              mov eax, dword ptr [004E2774]
  94. :004405BB E8D05FFCFF              call 00406590
  95. :004405C0 A174274E00              mov eax, dword ptr [004E2774]
  96. :004405C5 E8026AFCFF              call 00406FCC                    <-- Do the CD check
  97. :004405CA 85C0                    test eax, eax                    <-- Check the return value for pass/fail
  98. :004405CC 752E                    jne 004405FC                     <-- Take this jump if it passed
  99. :004405CE 8B0D74274E00            mov ecx, dword ptr [004E2774]
  100. :004405D4 85C9                    test ecx, ecx
  101. :004405D6 0F84E4FEFFFF            je 004404C0
  102. :004405DC 6A10                    push 00000010
  103.  
  104. * Possible StringData Ref from Data Obj ->"Shipwreckers!"
  105.                                   |
  106. :004405DE 6825414B00              push 004B4125
  107.  
  108. * Possible StringData Ref from Data Obj ->"Shipwreckers! requires the original "  <-- Otherwise ask for the CD
  109.                                         ->"CD to run."
  110.                                   |
  111. :004405E3 6833414B00              push 004B4133
  112. :004405E8 51                      push ecx
  113.  
  114. * Reference To: USER32.MessageBoxA, Ord:0010h
  115.                                   |
  116. :004405E9 2EFF1588134B00          Call dword ptr cs:[004B1388]
  117. :004405F0 E83B000000              call 00440630
  118. :004405F5 31C0                    xor eax, eax                     <-- Setup for quiting back to Win95
  119. :004405F7 5F                      pop edi
  120. :004405F8 5E                      pop esi
  121. :004405F9 59                      pop ecx
  122. :004405FA 5B                      pop ebx
  123. :004405FB C3                      ret
  124.  
  125. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  126. |:004405CC(C)
  127. |
  128. :004405FC E80B020000              call 0044080C                   <-- If you got this far the CD is there
  129. :00440601 85C0                    test eax, eax
  130. :00440603 0F84B7FEFFFF            je 004404C0
  131. :00440609 E8DA020000              call 004408E8
  132. :0044060E 85C0                    test eax, eax
  133. :00440610 0F84AAFEFFFF            je 004404C0
  134. :00440616 E805040000              call 00440A20
  135. :0044061B 85C0                    test eax, eax
  136. :0044061D 0F849DFEFFFF            je 004404C0
  137. :00440623 BE01000000              mov esi, 00000001
  138. :00440628 89F0                    mov eax, esi                   <-- Set eax "for continue with the game"
  139. :0044062A 5F                      pop edi
  140. :0044062B 5E                      pop esi
  141. :0044062C 59                      pop ecx
  142. :0044062D 5B                      pop ebx
  143. :0044062E C3                      ret
  144.  
  145.     There you have it, the easy way to crack this one is to change the call to the CD check
  146. routine to mov eax, 00000001, this forces the jne 004405FC at 4405CC to always be taken.  This
  147. in turns makes the game playable without the CD present, which is the whole purpose of this article.
  148.     There is one last little problem I wanted to correct:  While the intro to the game is cool,
  149. I could do without it and the same goes for the Psygnosis logo and Dolby intros.  So I set out to
  150. kill the call to those.  Idealy I would have liked to have been able to disable just the Psygnosis
  151. and Dolby intros and keep the game intro.  However if you have seen the game intro a couple of times
  152. you just want to skip it anyways.  So here is how to get Shipwreckers! to start right up skipping all
  153. the logo intros and go straight into the main menu screen.  First locate the refs to the intros:
  154.  
  155. * Referenced by a CALL at Address:
  156. |:0043DC93                                                  <-- Where the routine is called from
  157. |
  158. :0043E35C 53                      push ebx
  159. :0043E35D 51                      push ecx
  160. :0043E35E 52                      push edx
  161. :0043E35F 55                      push ebp
  162. :0043E360 89E5                    mov ebp, esp
  163. :0043E362 81EC18010000            sub esp, 00000118
  164. :0043E368 81ED96010000            sub ebp, 00000196
  165. :0043E36E 68402E4E00              push 004E2E40
  166.  
  167. * Possible StringData Ref from Data Obj ->"%spsyglogo.mpx"  <-- Psygnosis logo (mpeg file?)
  168.                                   |
  169. :0043E373 6884404B00              push 004B4084
  170. :0043E378 8D457E                  lea eax, dword ptr [ebp+7E]
  171. :0043E37B 50                      push eax
  172. :0043E37C E8EF0B0100              call 0044EF70
  173. :0043E381 83C40C                  add esp, 0000000C
  174. :0043E384 BBE0010000              mov ebx, 000001E0
  175. :0043E389 BA80020000              mov edx, 00000280
  176. :0043E38E 6A02                    push 00000002
  177. :0043E390 31C9                    xor ecx, ecx
  178. :0043E392 8D457E                  lea eax, dword ptr [ebp+7E]
  179. :0043E395 E85A320000              call 004415F4
  180. :0043E39A 68402E4E00              push 004E2E40
  181.  
  182. * Possible StringData Ref from Data Obj ->"%sdolby.mpx"    <-- Dolby logo
  183.                                   |
  184. :0043E39F 6894404B00              push 004B4094
  185. :0043E3A4 8D457E                  lea eax, dword ptr [ebp+7E]
  186. :0043E3A7 50                      push eax
  187. :0043E3A8 E8C30B0100              call 0044EF70
  188. :0043E3AD 83C40C                  add esp, 0000000C
  189. :0043E3B0 BBE0010000              mov ebx, 000001E0
  190. :0043E3B5 BA80020000              mov edx, 00000280
  191. :0043E3BA 6A02                    push 00000002
  192. :0043E3BC 31C9                    xor ecx, ecx
  193. :0043E3BE 8D457E                  lea eax, dword ptr [ebp+7E]
  194. :0043E3C1 E82E320000              call 004415F4
  195. :0043E3C6 68402E4E00              push 004E2E40
  196.  
  197. * Possible StringData Ref from Data Obj ->"%sintro.mpx"    <-- Game intro (cool to watch a couple of times)
  198.                                   |
  199. :0043E3CB 68A0404B00              push 004B40A0
  200. :0043E3D0 8D457E                  lea eax, dword ptr [ebp+7E]
  201. :0043E3D3 50                      push eax
  202. :0043E3D4 E8970B0100              call 0044EF70
  203. :0043E3D9 83C40C                  add esp, 0000000C
  204. :0043E3DC BBE0010000              mov ebx, 000001E0
  205. :0043E3E1 BA80020000              mov edx, 00000280
  206. :0043E3E6 6A02                    push 00000002
  207. :0043E3E8 31C9                    xor ecx, ecx
  208. :0043E3EA 8D457E                  lea eax, dword ptr [ebp+7E]
  209. :0043E3ED E802320000              call 004415F4
  210. :0043E3F2 8DA596010000            lea esp, dword ptr [ebp+00000196]
  211. :0043E3F8 5D                      pop ebp
  212. :0043E3F9 5A                      pop edx
  213. :0043E3FA 59                      pop ecx
  214. :0043E3FB 5B                      pop ebx
  215. :0043E3FC C3                      ret
  216.  
  217.     That's the routine that plays all the logo and intro files.  It has a single call to it so it
  218. should be easy enough to disable.  The section the calls the above logo display routine looks like:
  219.  
  220. :0043DC87 31C0                    xor eax, eax
  221. :0043DC89 A0E6844B00              mov al, byte ptr [004B84E6]
  222. :0043DC8E E81564FDFF              call 004140A8
  223. :0043DC93 E8C4060000              call 0043E35C                <-- Play the three logo files/movies
  224. :0043DC98 E8DFB10200              call 00468E7C
  225. :0043DC9D B838F64B00              mov eax, 004BF638
  226. :0043DCA2 E825FB0000              call 0044D7CC
  227.  
  228.     Changing the call to five NOP's results in a program that starts at the main menu screen.  This
  229. will save you about 20 megs on the hard drive after you delete those files (intro.mpx, dolby.mpx, and
  230. psyglogo.mpx).  The edit needed to crack this game would be:
  231.  
  232. Edit sw.exe at offset 260,549
  233. =============================
  234. Search for: E8 02 6A FC FF
  235. Change to : B8 01 00 00 00
  236.  
  237. OPTIONAL: To kill the intro files:
  238.  
  239. Edit sw.exe at offset 250,003
  240. =============================
  241. Search for: E8 C4 06 00 00
  242. Change to : 90 90 90 90 90
  243.  
  244.     Now Shipwreckers! has been completly FiX'ed
  245.  
  246. Static Vengeance
  247.